Use case: SPI transmit/receive in DMA mode

Sequence diagram

SPI transmit/receive in DMA mode

  @startuml
  "Application"->"SPI" : HAL_SPI_TransmitReceive_DMA(&hspi1, pTxData, RxBuffer, DATA_TO_SEND);
  "SPI" --> "Application" : HAL_OK
  "SPI"-> "DMA" : HAL_DMA_Start_IT(&hspi1);
  "DMAx_IRQHandler" <- : DMAx complete interrupt
  "DMAx_IRQHandler" -> "DMA" : HAL_DMA_IRQHandler(&hspi1);
  "DMA" -> "SPI" : XferCpltCallback(&hspi1);
  "Application" <- "SPI" : HAL_SPI_RegisterCallback(&hspi1, HAL_SPI_TX_RX_COMPLETE_CB_ID, USER_SPI_TxRxCpltCallback);
  @enduml

Code snippet

HAL1

HAL2

#define DATA_TO_SEND 255
#define DATA_TO_RECEIVE_SIZE  DATA_TO_SEND
uint8_t aRxBuffer[DATA_TO_RECEIVE_SIZE];
uint8_t aTxBuffer[] = "*** SPI communication based on DMA mode ***"
SPI_HandleTypeDef hspi1;

HAL_SPI_RegisterCallback(&hspi1, HAL_SPI_RX_COMPLETE_CB_ID, USER_SPI_TxRxCpltCallback);

HAL_SPI_TransmitReceive_DMA(&hspi1, aTxBuffer, aRxBuffer, DATA_TO_RECEIVE_SIZE);
#define DATA_TO_SEND 255
#define DATA_TO_RECEIVE_SIZE  DATA_TO_SEND
uint8_t aRxBuffer[BUFFERSIZE];
uint8_t aTxBuffer[] = "*** SPI communication based on DMA mode ***"
hal_spi_handle_t hspi1;

HAL_SPI_RegisterTxRxCpltCallback(&hspi1, HAL_SPI_RX_COMPLETE_CB_ID, USER_SPI_TxRxCpltCallback);

HAL_SPI_TransmitReceive_DMA(&hspi1, aTxBuffer, aRxBuffer, DATA_TO_RECEIVE_SIZE);

Key changes

  1. TX/RX complete callback registration uses the dedicated HAL2 registration API (HAL_SPI_RegisterTxRxCpltCallback()).

  2. HAL2 uses hal_spi_handle_t instead of SPI_HandleTypeDef.